/*
 * Copyright (c) 2024 endless-sky
 */

#pragma once

#include <string>

namespace El {
namespace Upgrade {

// 轻量 UBI 管理工具：用于在升级时安全地卸载/分离并恢复静态卷
class UbiManager {
public:
    UbiManager();
    ~UbiManager();

    // 资产静态卷（mtdN）写入前的准备：卸载挂载点、移除 ubiblock、分离 UBI
    // - mtd_num: 目标MTD编号（如6）
    // - mount_point: 挂载点（如"/mnt/assets"）
    // - vol_name: UBI卷名（如"assets"）
    // 幂等：未挂载/未创建/未附加时也会返回true
    bool PrepareStaticVolumePreWrite(int mtd_num, const std::string &mount_point, const std::string &vol_name);

    // 资产静态卷写入后的恢复：重新附加、创建 ubiblock 并挂载到指定挂载点
    bool RestoreStaticVolumePostWrite(int mtd_num, const std::string &mount_point, const std::string &vol_name);

private:
    bool IsMountPointMounted(const std::string &mount_point);
    bool UmountIfMounted(const std::string &mount_point);

    // 查询与mtd绑定的ubi设备号，存在则返回true
    bool FindUbiNumByMtd(int mtd_num, int &ubi_num);

    // 尝试移除 ubiblock 设备（若存在）；vol_id 通常为0（静态卷)
    bool RemoveUbiblockIfExists(int ubi_num, int vol_id);

    // 分离/附加 MTD
    bool DetachMtd(int mtd_num);
    bool AttachMtd(int mtd_num, int &ubi_num);

    // 根据卷名查找卷信息，返回 vol_id
    bool GetVolIdByName(int ubi_num, const std::string &vol_name, int &vol_id);

    // 创建 ubiblock 并挂载为 squashfs
    bool CreateUbiblockAndMount(int ubi_num, int vol_id, const std::string &mount_point);
};

} // namespace Upgrade
} // namespace El

